package abd.pr1.Controllers;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.sql.DataSource;

import org.apache.commons.lang3.StringUtils;

import abd.pr1.Interface.EpisodioWindow;
import abd.pr1.Interface.MainWindow;
import abd.pr1.Interface.NuevaSerieWindow;
import abd.pr1.Interface.NuevoComentarioSerieWindow;
import abd.pr1.Interface.SerieWindow;
import abd.pr1.Mappers.ClaveSeguidor;
import abd.pr1.Mappers.EpisodiosMapper;
import abd.pr1.Mappers.GenerosMapper;
import abd.pr1.Mappers.SeguidoresMapper;
import abd.pr1.Mappers.SeriesGenerosMapper;
import abd.pr1.Mappers.SeriesMapper;
import abd.pr1.Mappers.VotosSeriesMapper;
import abd.pr1.Models.Episodio;
import abd.pr1.Models.Genero;
import abd.pr1.Models.Seguidor;
import abd.pr1.Models.Serie;
import abd.pr1.Models.SerieGenero;
import abd.pr1.Models.Usuario;
import abd.pr1.Models.VotoSerie;

public class SerieWindowController implements ActionListener{
	
	private MainWindowController mainWindowController;
	private SerieWindow serieWindow;
	private DataSource ds;
	private Usuario user;
	private Serie serie;
	
	private Seguidor seguidor;
	
	public SerieWindowController(MainWindowController mainWindowController, SerieWindow serieWindow,DataSource ds, Usuario user, Serie serie){
		
		this.mainWindowController= mainWindowController;
		this.serieWindow=serieWindow;
		this.ds=ds;
		this.user=user;
		this.serie=serie;
		
		this.serieWindow.addListener(this);
		
		refreshSerie();
	}
	
	public void refreshSerie(){
		serieWindow.setNombre(serie.toString());
		serieWindow.setTitular(serie.getTitular());
		serieWindow.setSinopsis(serie.getSinopsis());
		List<VotoSerie> votoserie=new VotosSeriesMapper(ds).queryByExample(new VotoSerie(user.getId(), serie.getId(), null));
		int calificacion=0;
		if(votoserie.size()>0){
			calificacion=votoserie.get(0).getVoto();
		}
		serieWindow.setCalificacion(calificacion);
		serieWindow.setPuntuacion(new SeriesMapper(ds).puntuacionMedia(serie));
		List<SerieGenero> lsg = new SeriesGenerosMapper(ds).queryByExample(new SerieGenero(serie.getId(), null));
		List<Genero> generos = new ArrayList<Genero>();
		
		for (SerieGenero serieGenero : lsg) {
			generos.add(new GenerosMapper(ds).findById(serieGenero.getIdGenero()));
		}
		
		serieWindow.setGeneros(StringUtils.join(generos, ", "));
		
		
		seguidor = new SeguidoresMapper(ds).findById(new ClaveSeguidor(user.getId(), serie.getId()));
		

		List<Episodio> episodios= new EpisodiosMapper(ds).queryByExample(new Episodio(null, null, null, null, null, null, serie.getId()));
		Collections.sort(episodios);
		serieWindow.setEpisodioTable(episodios);
		
		serieWindow.setComentario(new SeriesMapper(ds).comentariosSerie(serie));
		
		refreshBotonSeguidor();
	}

	public void refreshBotonSeguidor(){
		if(seguidor!=null){
			serieWindow.setTextoBoton("No seguir");
		} else {
			serieWindow.setTextoBoton("Seguir Serie");
		}
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getActionCommand().equals("seguir_serie")){
			
			if(seguidor!=null){
				//borrar la fila de seguidores
				
				if(new SeguidoresMapper(ds).delete(seguidor)){
					seguidor=null;
					refreshBotonSeguidor();
				}
				
			} else {
				Seguidor seguidor= new Seguidor(user.getId(),serie.getId());
				
				if(new SeguidoresMapper(ds).insert(seguidor)){
					this.seguidor = seguidor;
					refreshBotonSeguidor();
				}
				
			}
			
			this.mainWindowController.refreshMisSeriesPanelController();
			
			
		} else if(e.getActionCommand().equals("cerrar_serie")){
			serieWindow.dispose();
		}
		else if(e.getActionCommand().equals("informacion_episodios")){
			
			Episodio episodioSelected=serieWindow.getEpisodioSelected();
			if(episodioSelected!=null){
				new EpisodioWindowController(mainWindowController,new EpisodioWindow(), ds,user,episodioSelected);
			}
		}
		else if(e.getActionCommand().equals("calificar_serie")){
			
			
			List<VotoSerie> votoUsuario=new VotosSeriesMapper(ds).queryByExample(new VotoSerie(user.getId(), serie.getId(), null));
			if(votoUsuario.size()>0)
			{
				
				votoUsuario.get(0).setVoto(serieWindow.getCalificacion());
				new VotosSeriesMapper(ds).update(votoUsuario.get(0));
			}else{
				VotoSerie votoSerie= new VotoSerie(user.getId(), serie.getId(), serieWindow.getCalificacion());
				new VotosSeriesMapper(ds).insert(votoSerie);
			}
			this.refreshSerie();
			
		}else if(e.getActionCommand().equals("nuevo_comentario")){
			System.out.println("aaaa");
			new NuevoComentarioSerieWindowController(this, new NuevoComentarioSerieWindow(), this.ds, this.serie, this.user);
		}
		
	}

}
